"""
description: 类属性在继承中的特点
author: Mr_52Hz
date: 2019-07-22
"""
from utils.test_tools import test_decorator


class Person(object):

    type_ = 'Person'

    def __init__(self):
        # 保护属性-允许对象修改-允许继承
        self._name = 'person'
        # 私有属性
        self.__age = 19

    def _get_age(self):
        return self.__age

    def __get_age(self):
        return self.__age

    def get_age(self):
        return self.__get_age()


class Teacher(Person):

    def __init__(self):
        super().__init__()


@test_decorator('class-测试属性访问')
def test_attribute():
    # 实例化Person类，创建p1对象
    p1 = Person()
    print('对象访问保护属性_name: ', p1._name)
    # 修改对象的保护属性_name
    p1._name = 1
    print(p1._name)
    # 访问私有属性__age，报错
    # print(p1.__age)
    print('对象访问类属性type_: ', p1.type_)


@test_decorator('class-测试继承')
def test_inherit_attribute():
    # 实例化Teacher类，创建T1对象
    t1 = Teacher()
    print('对象访问继承的保护属性_name: ', t1._name)
    print('对象访问继承的类属性type_: ', t1.type_)
    # print('对象访问继承的私有属性__age: 报错！！', t1.__age)


@test_decorator('class-测试方法访问')
def test_function():
    p1 = Person()
    print('对象访问保护方法_get_age: ', p1._get_age())
    # print('对象访问私有方法__get_age: 报错！！', p1.__get_age())
    print('对象访问方法get_age（方法中访问私有方法__get_age）', p1.get_age())


@test_decorator('class-测试方法继承')
def test_inherit_function():
    t1 = Teacher()
    print('对象访问继承的保护方法_get_age: ', t1._get_age())
    # 特别的需要注意t1是没有__age属性的，但是通过get_age()是可以访问到父类的__age属性的
    print('对象访问继承的方法get_age: ', t1.get_age())
    # print('对象访问继承的__get_age: 报错!', t1.__get_age())


if __name__ == '__main__':
    # 对象可以访问 类属性 保护属性 对象属性
    # 对象不可以访问 私有属性-私有属性仅供类内访问和修改
    test_attribute()
    # 对象可以继承 类属性 保护属性 对象属性
    # 对象不可以继承 私有属性
    test_inherit_attribute()
    # 对象可以访问 对象方法 保护方法
    # 对象不可以访问 私有方法-私有方法仅供类内访问
    test_function()
    # 对象可以继承 对象方法 保护方法
    # 对象不可以访问 私有方法
    test_inherit_function()
    # 思考 - 继承属相方法 访问了不可继承的私有属性 反映了什么原理？





